import { request } from '@/http'
import type { ApiResponse } from '@/http'

/**
 * 学习主题数据结构接口
 * 定义学习主题的完整数据结构，包含基本信息、学段、年级、难度等属性
 */
export interface Subject {
  id: string // 主题唯一标识
  name: string // 主题名称
  description: string // 主题描述
  icon: string // 主题图标
  level: 'primary' | 'junior' | 'senior' | 'university' // 学段：小学/初中/高中/大学
  grade: number[] // 适用年级数组
  difficulty: 'easy' | 'medium' | 'hard' // 难度等级：简单/中等/困难
  prerequisites: string[] // 前置知识主题ID数组
  estimatedTime: number // 预计学习时间（分钟）
  topics: Topic[] // 具体知识点列表
  createdAt: string // 创建时间
  updatedAt: string // 更新时间
}

/**
 * 知识点数据结构接口
 * 定义每个学习主题下的具体知识点
 */
export interface Topic {
  id: string // 知识点唯一标识
  name: string // 知识点名称
  description: string // 知识点描述
  order: number // 学习顺序（数字越小越优先）
}

/**
 * 学段数据结构接口
 * 定义不同教育阶段的信息
 */
export interface Level {
  id: string // 学段唯一标识
  name: string // 学段名称（如：小学、初中、高中、大学）
  description: string // 学段描述
  grades: number[] // 包含的年级数组
}

/**
 * 难度等级数据结构接口
 * 定义不同难度等级的信息
 */
export interface Difficulty {
  id: string // 难度唯一标识
  name: string // 难度名称（如：简单、中等、困难）
  description: string // 难度描述
}

/**
 * API响应接口 - 学习主题列表
 * 后端返回的学习主题列表数据结构
 */
export interface SubjectListData {
  list: Subject[]
  total: number
}

/**
 * 获取学习主题列表
 * 支持按学段、年级、难度等条件筛选
 * @param params 筛选参数
 * @param params.level 学段筛选 (primary/junior/senior/university)
 * @param params.grade 年级筛选 (1-16)
 * @param params.difficulty 难度筛选 (easy/medium/hard)
 * @returns Promise<SubjectsResponse> 学习主题列表响应
 */
export function getAllSubjects(params?: { level?: string; grade?: number; difficulty?: string }) {
  return request<ApiResponse<SubjectListData>>({
    url: '/subjects',
    method: 'GET',
    params,
  })
}

/**
 * 根据ID获取单个学习主题详情
 * @param id 学习主题的ID
 * @returns Promise<SubjectResponse> 学习主题详情响应
 */
export function getSubjectById(id: string) {
  return request<ApiResponse<Subject>>({
    url: `/subjects/${id}`,
    method: 'GET',
  })
}

/**
 * 创建新的学习主题
 * @param data 学习主题数据（必填：name, description, level）
 * @returns Promise<SubjectResponse> 创建结果响应
 */
export function addSubject(data: Partial<Subject>) {
  return request<ApiResponse<Subject>>({
    url: '/subjects',
    method: 'POST',
    data,
  })
}

/**
 * 更新学习主题信息
 * @param id 要更新的学习主题ID
 * @param data 要更新的数据字段
 * @returns Promise<SubjectResponse> 更新结果响应
 */
export function updateSubject(id: string, data: Partial<Subject>) {
  return request<ApiResponse<Subject>>({
    url: `/subjects/${id}`,
    method: 'PUT',
    data,
  })
}

/**
 * 删除学习主题
 * @param id 要删除的学习主题ID
 * @returns Promise<{success: boolean, message: string}> 删除结果响应
 */
export function deleteSubject(id: string) {
  return request<ApiResponse<boolean>>({
    url: `/subjects/${id}`,
    method: 'DELETE',
  })
}

/**
 * 获取所有学段信息
 * @returns Promise<LevelsResponse> 学段列表响应
 */
export function getAllLevels() {
  return request<ApiResponse<Level[]>>({
    url: '/subjects/levels/all',
    method: 'GET',
  })
}

/**
 * 获取所有难度等级信息
 * @returns Promise<DifficultiesResponse> 难度等级列表响应
 */
export function getAllDifficulties() {
  return request<ApiResponse<Difficulty[]>>({
    url: '/subjects/difficulties/all',
    method: 'GET',
  })
}

/**
 * 获取指定学段的所有学习主题
 * @param level 学段ID (primary/junior/senior/university)
 * @returns Promise<SubjectsResponse> 学习主题列表响应
 */
export function getSubjectsByLevel(level: string) {
  return request<ApiResponse<SubjectListData>>({
    url: `/subjects/level/${level}`,
    method: 'GET',
  })
}

/**
 * 获取指定年级适用的所有学习主题
 * @param level 学段ID (primary/junior/senior/university)
 * @returns Promise<SubjectsResponse> 学习主题列表响应
 */
export function getSubjectsByGrade(grade: number) {
  return request<ApiResponse<SubjectListData>>({
    url: `/subjects/grade/${grade}`,
    method: 'GET',
  })
}
